package model

import (
	"fmt"
	"os"
	"os/exec"
	"regexp"
	"strings"
)

// GetSshVersion 获取当前SSH版本
func GetSshVersion() (string, error) {
	// 执行 ssh -V 命令
	cmd := exec.Command("ssh", "-V")
	output, err := cmd.CombinedOutput()
	if err != nil {
		return "", fmt.Errorf("获取 SSH 版本信息失败: %v", err)
	}

	// 正则提取版本号
	re := regexp.MustCompile(`OpenSSH_([0-9]+\.[0-9]+(?:p[0-9]+)?)`)
	matches := re.FindStringSubmatch(string(output))

	if len(matches) > 1 {
		version := matches[1]
		GetLanguageManager().Debug("当前SSH版本: ", "Current SSH version: ", version)
		return version, nil
	}

	return "", fmt.Errorf("无法解析 SSH 版本信息")
}

// GetSystemPackageSshVersion 获取系统包管理器中的SSH版本
func GetSystemPackageSshVersion() (string, error) {
	// 使用glpm包获取系统包版本信息
	version, err := GetPackageVersion("openssh-client")
	if err != nil {
		// 如果openssh-client失败，尝试openssh-server
		version, err = GetPackageVersion("openssh-server")
		if err != nil {
			// 如果openssh-server失败，尝试ssh
			version, err = GetPackageVersion("ssh")
			if err != nil {
				return "", fmt.Errorf("无法获取系统包管理器中的SSH版本")
			}
		}
	}

	GetLanguageManager().Debug("系统包SSH版本: ", "System SSH version: ", version)
	return version, nil
}

// CheckSshVersionMatch 检查SSH版本是否匹配系统包版本
func CheckSshVersionMatch(china, debug bool) bool {
	if debug {
		GetLanguageManager().Debug("开始通过版本比对检测SSH是否为系统包安装", "Starting SSH version comparison check")
	}

	// 获取当前SSH版本
	currentVersion, err := GetSshVersion()
	if err != nil {
		if debug {
			GetLanguageManager().Debug("获取当前SSH版本失败: ", "Failed to get current SSH version: ", err)
		}
		return false
	}

	if debug {
		GetLanguageManager().Debug("当前SSH版本: ", "Current SSH version: ", currentVersion)
	}

	// 获取系统包SSH版本
	systemVersion, err := GetSystemPackageSshVersion()
	if err != nil {
		if debug {
			GetLanguageManager().Debug("获取系统包SSH版本失败: ", "Failed to get system SSH version: ", err)
		}
		return false
	}

	if debug {
		GetLanguageManager().Debug("系统包SSH版本: ", "System SSH version: ", systemVersion)
	}

	// 比较版本
	isMatch := currentVersion == systemVersion
	if debug {
		if isMatch {
			GetLanguageManager().Debug("版本匹配，检测为系统包安装", "Version match, detected as system package installation")
		} else {
			GetLanguageManager().Debug("版本不匹配，检测为编译安装", "Version mismatch, detected as compiled installation")
		}
	}

	return isMatch
}

// IsDefault 函数用于检查当前SSH配置文件是否为系统默认安装的配置文件。
// 该函数通过多重检测方法综合判断是否为默认安装：
// 1. 优先使用版本比对检测（通过ssh -V和包管理器版本对比）
// 2. 备选使用软链接检测
//
// 参数:
//   - china: 布尔值，用于控制日志输出的语言。如果为true，则使用中文日志；否则使用英文日志。
//   - debug: 布尔值，用于控制是否显示调试信息。
//
// 返回值:
//   - bool: 如果配置文件是系统默认安装的，则返回true；否则返回false。
func IsDefault(china, debug bool) bool {
	if debug {
		GetLanguageManager().Debug("正在检查当前SSH程序是否为系统默认安装", "Checking if the SSH program is the system default installation")
	}

	// 第一步：使用版本比对检测（最可靠的方法）
	if debug {
		GetLanguageManager().Debug("优先使用版本比对检测", "Using version comparison detection first")
	}

	versionMatch := CheckSshVersionMatch(china, debug)
	if versionMatch {
		if debug {
			GetLanguageManager().Debug("版本比对检测结果：系统包SSH，init=true", "Version comparison result: system package SSH, init=true")
		}
		return true
	}

	// 第二步：使用软链接检测（备选方法）
	if debug {
		GetLanguageManager().Debug("版本比对无法确定，使用软链接检测", "Version comparison inconclusive, using symlink detection")
	}

	// 检查SSH程序位置
	sshdPath := "/usr/sbin/sshd"
	sshPath := "/usr/bin/ssh"

	// 检查sshd程序是否存在
	if _, err := os.Stat(sshdPath); os.IsNotExist(err) {
		// 如果/usr/sbin/sshd不存在，检查/usr/bin/ssh的软链接
		if debug {
			GetLanguageManager().Debug("/usr/sbin/sshd不存在，检查/usr/bin/ssh", "/usr/sbin/sshd not found, checking /usr/bin/ssh")
		}

		if isLink, err := IsSymlink(sshPath); err == nil && isLink {
			// /usr/bin/ssh是符号链接，读取其真实指向
			if realPath, err := os.Readlink(sshPath); err == nil {
				if debug {
					GetLanguageManager().Debug(fmt.Sprintf("/usr/bin/ssh软链接指向: %s", realPath), fmt.Sprintf("/usr/bin/ssh symlink points to: %s", realPath))
				}

				// 检查是否指向编译安装路径
				if strings.Contains(realPath, "/usr/local/openssh") {
					if debug {
						GetLanguageManager().Debug("软链接检测结果：编译安装SSH，init=false", "Symlink detection result: compiled SSH installation, init=false")
					}
					return false // 编译安装
				} else if strings.Contains(realPath, "/usr/") {
					if debug {
						GetLanguageManager().Debug("软链接检测结果：系统包SSH，init=true", "Symlink detection result: system package SSH, init=true")
					}
					return true // 系统包安装
				}
			}
		}

		// 如果都检查不到，返回版本比对的反结果
		if debug {
			GetLanguageManager().Debug("软链接检测无确定结果，使用版本比对反结果：", "Symlink detection inconclusive, using version comparison inverse result: ", !versionMatch)
		}
		return !versionMatch
	}

	// /usr/sbin/sshd存在，检查SSH程序类型
	// 无论/usr/sbin/sshd是否为符号链接，都应该检查/usr/bin/ssh的软链接状态
	// 因为编译安装的SSH可能同时存在/usr/bin/ssh软链接和/usr/sbin/sshd普通文件

	if debug {
		GetLanguageManager().Debug("检查/usr/bin/ssh的软链接状态", "Checking /usr/bin/ssh symlink status")
	}

	// 检查/usr/bin/ssh的软链接状态
	if isLink, err := IsSymlink(sshPath); err == nil && isLink {
		// /usr/bin/ssh是符号链接，读取其真实指向
		if realPath, err := os.Readlink(sshPath); err == nil {
			if debug {
				GetLanguageManager().Debug(fmt.Sprintf("/usr/bin/ssh软链接指向: %s", realPath), fmt.Sprintf("/usr/bin/ssh symlink points to: %s", realPath))
			}

			// 检查是否指向编译安装路径
			if strings.Contains(realPath, "/usr/local/openssh") {
				if debug {
					GetLanguageManager().Debug("软链接检测结果：编译安装SSH，init=false", "Symlink detection result: compiled SSH installation, init=false")
				}
				return false // 编译安装
			} else if strings.Contains(realPath, "/usr/") {
				if debug {
					GetLanguageManager().Debug("软链接检测结果：系统包SSH，init=true", "Symlink detection result: system package SSH, init=true")
				}
				return true // 系统包安装
			}
		}
	}

	// 如果/usr/bin/ssh不是软链接，检查/usr/sbin/sshd的状态
	isLink, err := IsSymlink(sshdPath)
	if err != nil {
		if debug {
			GetLanguageManager().Debug("检查SSH程序状态时出错，使用版本比对结果: ", "Error checking SSH program status, using version comparison result: ", versionMatch)
		}
		return versionMatch
	}

	if isLink {
		// /usr/sbin/sshd是符号链接
		if realPath, err := os.Readlink(sshdPath); err == nil {
			if debug {
				GetLanguageManager().Debug(fmt.Sprintf("/usr/sbin/sshd软链接指向: %s", realPath), fmt.Sprintf("/usr/sbin/sshd symlink points to: %s", realPath))
			}

			// 检查真实路径
			if strings.Contains(realPath, "/usr/local/openssh") {
				if debug {
					GetLanguageManager().Debug("软链接检测结果：编译安装SSH，init=false", "Symlink detection result: compiled SSH installation, init=false")
				}
				return false // 编译安装
			} else if strings.Contains(realPath, "/usr/") {
				if debug {
					GetLanguageManager().Debug("软链接检测结果：系统包SSH，init=true", "Symlink detection result: system package SSH, init=true")
				}
				return true // 系统包安装
			}
		}
	} else {
		// /usr/sbin/sshd是普通文件，无法通过软链接判断，使用版本比对结果
		if debug {
			GetLanguageManager().Debug("检测到普通SSH程序文件，使用版本比对结果", "Detected regular SSH program file, using version comparison result")
		}
		return versionMatch
	}

	// 所有检测方法都无确定结果，返回版本比对结果
	if debug {
		GetLanguageManager().Debug("所有检测方法都无法确定结果，使用版本比对结果：", "All detection methods inconclusive, using version comparison result: ", versionMatch)
	}
	return versionMatch
}
